package com.situ.fly.controller;

import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import javax.servlet.http.HttpSession;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;

import com.situ.fly.entity.User;
import com.situ.fly.service.AnswerService;
import com.situ.fly.service.QuestionService;
import com.situ.fly.service.UserService;


@Controller
@RequestMapping("/user/") // 给当前所有方法映射添加一个前缀
public class UserController{
	
	@Autowired
	private UserService userService;
	
	@Autowired
	private QuestionService questionService;
	
	@Autowired
	private AnswerService answerService;
	
	
	/**
	 * 获取注册页面
	 */
	@GetMapping("/reg")
	public String reg() {
		
		return "/user/reg"; // 模版的名字
	}
	
	/**
	 * 处理注册操作
	 */
	@PostMapping("/reg")
	public String reg(User user, String rePassword, String vercode,//  参数的自动注入
			HttpSession session, 
			Model model) {
		
		// 验证验证码
		if ( BaseVerCode.checkVerCode(vercode, session, model) == false) {
			// 验证失败
			return "/user/reg";
		}
		
		
		// 调用Service层完成注册操作
		int code = userService.reg(user, rePassword);
		
		if (code > 0) {
			// 注册成功, 跳转到登录页面
			return "redirect:/user/login";
		} else {
			// 注册失败
			switch (code) {
			case -1:
				model.addAttribute("error", "账号和密码不能少于3位, 昵称不能少于2位");
				break;
			case -2:
				model.addAttribute("error", "两次密码不一致");
				break;
			case -3:
				model.addAttribute("error", "账号不可用");
				break;
			case -4:
				model.addAttribute("error", "昵称不可用");
				break;
			default:
				model.addAttribute("error", "未知错误, 请联系管理员!!!");
				break;
			}
			
			return "/user/reg"; // 返回注册页面
		}
	}
	
	/**
	 * 获取登录页面
	 */
	@GetMapping("/login")
	public String login() {
		return "/user/login";
	}
	
	/**
	 * 处理登录请求
	 */
	@PostMapping("/login")
	public String login(User user, String vercode, 
			HttpSession session,
			Model model) {
		
		// 检查验证码
		if (BaseVerCode.checkVerCode(vercode, session, model) == false) {
			// 验证失败, 回到登录页面
			return "/user/login";
		}
		
		// 调用Service层进行业务处理
		try {
			user = userService.login(user);
			
			// 登录成功了
			// 1. 保存登录信息, session
			session.setAttribute("user", user);
			
			// 2. 跳转页面
			return "redirect:/";
			
		} catch (Exception e) {
			e.printStackTrace();
			
			// 1. 传递错误信息
			model.addAttribute("error", e.getMessage());
		}
		
		// 2. 返回登录页面
		return "/user/login";
	}
		
	/**
	 * 退出操作
	 */
	@GetMapping("/logout")
	public String logout(HttpSession session) {
		// 清除Session中的登录信息  Token
		// session.removeAttribute("user");
		session.invalidate();
		
		// 跳转页面
		return "redirect:/";
	}
	
	/**
	 * 打开设置页面
	 */
	@GetMapping("/set")
	public String set() {
		return "/user/set";
	}
	
	/**
	 * 这是一个Ajax的请求, 必须要返回JSON的格式的数据
	 * @responseBody注解, 可以将一个类, 转换成JSON的表示方式
	 */
	@PostMapping("/set")
	@ResponseBody
	public Object set(User user, HttpSession session) {
		// 从Session中获取当前登录的用户信息
		User loginUser = (User) session.getAttribute("user");
		
		user.setId(loginUser.getId());
		
		// 修改个人信息
		int res = userService.edit(user);
		
		// 根据对模版代码分析: 返回的JSON数据必须包含一个status===0表示成功,  失败的错误信息, 通过msg传递
		
		// 使用Map作为数据的返回
		Map<String, Object> result = new HashMap<>();

		if (res>0) {
			// 修改成功
			result.put("status", 0);
			result.put("msg", "修改成功");
			
			// 更新一下当前登录用户的信息
			loginUser = userService.getById(loginUser.getId());
			session.setAttribute("user", loginUser);
			
		} else if (res == -1) {
			result.put("status", res);
			result.put("msg", "昵称不能少于2位!!");
		} else if (res == -2) {
			result.put("status", res);
			result.put("msg", "昵称已经被使用");
		} else {
			result.put("status", -3);
			result.put("msg", "未知错误, 请联系管理员!!!");
		}

		return result;
	}
	
	@PostMapping("/resetPassword")
	@ResponseBody
	public Object resetPassword(String nowpass, String pass, String repass,
			HttpSession session) {
		
		User user = (User) session.getAttribute("user");
		int res = userService.resetPassword(user.getId(), nowpass, pass, repass);
		
		// 使用Map作为数据的返回
		Map<String, Object> result = new HashMap<>();
		
		if (res>0) {
			// 修改成功
			result.put("status", 0);
			result.put("msg", "修改成功");
		} else if (res == -1) {
			result.put("status", res);
			result.put("msg", "两次密码不一致");
		} else if (res == -2) {
			result.put("status", res);
			result.put("msg", "旧密码不正确");
		} else {
			result.put("status", -3);
			result.put("msg", "未知错误, 请联系管理员!!!");
		}
		
		return result;
	}
	
	/**
	 * 设置用户头像
	 */
	@PostMapping("/head")
	@ResponseBody
	public Object head(String head, HttpSession session) {
		
		// 获取当前登录的用户
		User user = (User) session.getAttribute("user");
		
		int res = userService.setHead(user.getId(), head);
		
		Map<String, Object> result = new HashMap<>();
		
		if (res > 0) {
			// 头像修改成功
			result.put("status", 0);
			result.put("msg", "头像修改成功");
			
			// 更新一下登录用户的信息
			user = userService.getById(user.getId());
			session.setAttribute("user", user);
			
		} else {
			// 修改失败
			result.put("status", -1);
			result.put("msg", "头像修改失败");
		}
		
		return result;
	}
	
	@GetMapping("/home")
	public String home(Integer id, HttpSession session, Model model) {
		
		// 没传用户ID, 就显示当前用户
		if (id==null) {
			User user = (User) session.getAttribute("user");
			id = user.getId();
		}
		
		// 查询用户信息
		User user = userService.getById(id);
		model.addAttribute("user", user);
		
		// 查询提问
		List questions = questionService.getByUid(id);
		model.addAttribute("questions", questions);
		
		// 查询回答
		List answers = answerService.getByUid(id);
		model.addAttribute("answers", answers);
		
		return "/user/home";
	}
	
	@GetMapping("/index")
	public String index(HttpSession session, Model model) {
		
		User user = (User) session.getAttribute("user");
		
		List myQuestions = questionService.getByUid(user.getId());
		
		model.addAttribute("myQuestions", myQuestions);
		
		return "/user/index";
	}
}








